///*
// * To change this template, choose Tools | Templates
// * and open the template in the editor.
// */
//package linkeddata.arida.ufc.br.rascunhos;
//
//import java.util.ArrayList;
//import java.util.Iterator;
//import java.util.Map;
//import java.util.Set;
//import linkeddata.arida.ufc.br.enums.ClausesSparql;
//import linkeddata.arida.ufc.br.manager.SparqlQuery;
//import linkeddata.arida.ufc.br.manager.impl.BuildsHierarchyDataProperty;
//import linkeddata.arida.ufc.br.util.TripleStore;
//import org.semanticweb.owlapi.model.OWLEntity;
//import org.semanticweb.owlapi.model.OWLException;
//import org.semanticweb.owlapi.model.OWLOntologyCreationException;
//
///**
// *
// * @author jeovane
// */
//public class BuildsSparqlQueryRasc extends BuildsHierarchyDataProperty implements SparqlQuery {
//
//    @Override
//    public void buildsSelectRasc(String nameClass, String nameDataProperties, ArrayList<String> arrayUnion) throws OWLOntologyCreationException {
//        // Carrega a ontologia e o PrefixManager
//        ontologyLoaded();
//
//        //buildsHeadQuery();
//
//        arrayCurrentClass = new ArrayList<String>();
//        arrayCurrentClass.add(nameClass);
//
//        // Adiciona os predicados nos quais as classes tem ligação com alguma outra.
//        arrayObjectDomain.add(nameClass);
//
//        // Obtém o nome da classe corrente
//        currentClass = arrayCurrentClass.get(0);
//
//        // Obtém o nome do dataproperty no qual a consulta estar sendo realizada
//        nameDataProperty = nameDataProperties;
//
//        // Adiciona a cláusula SELECT na consulta
//        query = ClausesSparql.SELECT.toString();
//
//        if (arrayUnion.size() > 1) {
//            if (currentClass.equalsIgnoreCase(arrayUnion.get(0))) {
//                query = ClausesSparql.SELECT.toString();
//            } else {
//                query = "";
//            }
//            queryUnion = "     " + ClausesSparql.SELECT.toString();
//            buildsSelectUnionRasc(arrayUnion);
//        } else {
//            for (Iterator it = buildsHierarchy(getOntology()).entrySet().iterator(); it.hasNext();) {
//                Map.Entry entry = (Map.Entry) it.next();
//                String key = getPm().getShortForm((OWLEntity) entry.getKey()).replace(":", "");
//                ArrayList<OWLEntity> arrayValues = (ArrayList<OWLEntity>) entry.getValue();
//                for (OWLEntity owlEntity : arrayValues) {
//                    String valueKey = getPm().getShortForm(owlEntity).replace(":", "");
//                    if (!nameDataProperty.isEmpty()) {
//                        if (key.equalsIgnoreCase(currentClass) && valueKey.equals(nameDataProperty) && !valueKey.isEmpty()) {
//                            setSelect.add(" ?" + currentClass + "_" + valueKey);
//                        }
//                    } else {
//                        if (key.equalsIgnoreCase(currentClass) && !valueKey.isEmpty()) {
//                            setSelect.add(" ?" + currentClass + "_" + valueKey);
//                        }
//                    }
//                }
//            }
//            for (String varSelect : setSelect) {
//                query += varSelect;
//            }
//        }
//    }
//
//    @Override
//    public ArrayList<String> buildsWhereRasc(ArrayList<String> arrayWhere) throws OWLOntologyCreationException {
//        // Adiciona a cláusula WHERE na consulta
//        if (queryUnion == null) {
//            query += "\n" + ClausesSparql.WHERE.toString() + " {";
//        } else {
//            query = ClausesSparql.SERVICE.toString() + " <> { \n"
//                    + queryUnion + " \n     " + ClausesSparql.WHERE.toString() + " {";
//
////            query += "\n" + ClausesSparql.WHERE.toString() + " { "
////                    + "\n   { " + ClausesSparql.SERVICE.toString() + " <> { \n"
////                    + queryUnion + " \n     " + ClausesSparql.WHERE.toString() + " {";
//        }
//
//        prefix = "ddg";
//        TripleStore ts;
//
//        if (arrayWhere.size() > 1) {
//            buildsWhereUnionRasc(arrayWhere);
//        } else {
//            for (Iterator it = buildsHierarchy(getOntology()).entrySet().iterator(); it.hasNext();) {
//                Map.Entry entry = (Map.Entry) it.next();
//                String key = getPm().getShortForm((OWLEntity) entry.getKey()).replace(":", "");
//                String value = entry.getValue().toString();
//                ArrayList<OWLEntity> arrayList = (ArrayList<OWLEntity>) entry.getValue();
//
//                for (OWLEntity owlEntity : arrayList) {
//                    String valueKey = getPm().getShortForm(owlEntity).replace(":", "");
//                    if (!nameDataProperty.isEmpty()) {
//                        if (key.equalsIgnoreCase(currentClass) && valueKey.equals(nameDataProperty) && !value.isEmpty()) {
//                            if (arrayObjectDomain.get(0).equals(currentClass)) {
//                                setWhere.add("\n   ?" + currentClass + " "
//                                        + prefix + ":" + valueKey
//                                        + " ?" + currentClass + "_" + valueKey + ".");
//                            } else {
//                                setWhere.add("\n   ?" + arrayObjectDomain.get(0) + " "
//                                        + prefix + ":" + valueKey
//                                        + " ?" + currentClass + "_" + valueKey + ".");
//                            }
//                        }
//                    } else {
//                        //System.out.println("Key: " + key + " currentClass: "  + currentClass);
//                        if (key.equalsIgnoreCase(currentClass) && !value.isEmpty()) {
//                            //System.out.println(arrayObjectDomain.get(0) + " : " + currentClass);
//                            if (arrayObjectDomain.get(0).equals(currentClass)) {
//                                setWhere.add("\n   ?" + currentClass + " "
//                                        + prefix + ":" + valueKey
//                                        + " ?" + currentClass + "_" + valueKey + ".");
//                            } else {
//                                System.out.println(arrayObjectDomain.get(0));
//                                setWhere.add("\n   ?" + arrayObjectDomain.get(0) + " "
//                                        + prefix + ":" + valueKey
//                                        + " ?" + currentClass + "_" + valueKey + ".");
//                            }
//                        }
//                    }
//                }
//            }
//
//            for (Iterator it = buildsObjectProperty(getOntology()).iterator(); it.hasNext();) {
//                ts = (TripleStore) it.next();
//                //System.out.println(currentClass + " : " + ts.getDomain());
//                if (currentClass.equals(ts.getDomain())) {
//                    setWhere.add("\n   ?" + ts.getDomain() + " "
//                            + prefix + ":" + ts.getObjectProperty()
//                            + " ?" + ts.getRange() + "_" + ts.getDomain() + ".");
//                    arrayCurrentClass.add(ts.getRange().toString());
//                    arrayCurrentClass.remove(currentClass);
//                    arrayObjectDomain.add(ts.getRange() + "_" + ts.getDomain());
//                }
//            }
//
//            arrayObjectDomain.remove(arrayObjectDomain.get(0));
//
//            for (String varWhere : setWhere) {
//                query += varWhere;
//            }
//        }
//
//        query += "\n}";
//        return arrayCurrentClass;
//    }
//
//    @Override
//    public void buildsSelectUnionRasc(ArrayList<String> arrayUnion) {
//        for (Iterator<String> it = arrayUnion.iterator(); it.hasNext();) {
//            String srtUnion = it.next();
//            for (Iterator it1 = buildsHierarchy(getOntology()).entrySet().iterator(); it1.hasNext();) {
//                Map.Entry entry = (Map.Entry) it1.next();
//                String key = getPm().getShortForm((OWLEntity) entry.getKey()).replace(":", "");
//                ArrayList<OWLEntity> arrayValues = (ArrayList<OWLEntity>) entry.getValue();
//                if (key.equalsIgnoreCase(srtUnion)) {
//                    for (OWLEntity owlEntity : arrayValues) {
//                        String valueKey = getPm().getShortForm(owlEntity).replace(":", "");
//                        arraySelectUnion.add(valueKey);
//                        if (!nameDataProperty.isEmpty() && valueKey.equals(nameDataProperty) && !valueKey.isEmpty()) {
//                            //setSelect.add(" ?" + currentClass + "_" + valueKey);
//                            queryUnion += " ?" + currentClass + "_" + valueKey;
//                        } else {
//                            if (key.equalsIgnoreCase(currentClass) && !valueKey.isEmpty()) {
//                                //setSelect.add(" ?" + currentClass + "_" + valueKey);
//                                queryUnion += " ?" + currentClass + "_" + valueKey;
//                            }
//                        }
//                    }
//                }
//            }
//        }
//
//        String varsSelect = "";
//        for (String varNames : arraySelectUnion) {
//            varsSelect += "?" + varNames + " ";
//        }
//        query += " " + varsSelect;
//        //return query;
//    }
//
//    @Override
//    public void buildsWhereUnionRasc(ArrayList<String> arrayWhere) {
//        for (Iterator<String> it = arrayWhere.iterator(); it.hasNext();) {
//            String srtUnion = it.next();
//            //queryUnion += "\n" + srtUnion;
//            for (Iterator it1 = buildsHierarchy(getOntology()).entrySet().iterator(); it1.hasNext();) {
//                Map.Entry entry = (Map.Entry) it1.next();
//                String key = getPm().getShortForm((OWLEntity) entry.getKey()).replace(":", "");
//                ArrayList<OWLEntity> arrayValues = (ArrayList<OWLEntity>) entry.getValue();
//                if (key.equalsIgnoreCase(srtUnion)) {
//                    for (OWLEntity owlEntity : arrayValues) {
//                        String valueKey = getPm().getShortForm(owlEntity).replace(":", "");
//                        if (!nameDataProperty.isEmpty() && valueKey.equals(nameDataProperty) && !valueKey.isEmpty()) {
//                            if (arrayObjectDomain.get(0).equals(currentClass)) {
//                                query += "\n       ?" + currentClass + " "
//                                        + prefix + ":" + valueKey
//                                        + " ?" + currentClass + "_" + valueKey + ".";
//                            } else {
//                                query += "\n       ?" + arrayObjectDomain.get(0) + " "
//                                        + prefix + ":" + valueKey
//                                        + " ?" + currentClass + "_" + valueKey + ".";
//                            }
//                        } else {
//                            if (key.equalsIgnoreCase(currentClass) && !valueKey.isEmpty()) {
//                                if (arrayObjectDomain.get(0).equals(currentClass)) {
//                                    setWhere.add("\n       ?" + currentClass + " "
//                                            + prefix + ":" + valueKey
//                                            + " ?" + currentClass + "_" + valueKey + ".");
////                                    query += "\n       ?" + currentClass + " "
////                                            + prefix + ":" + valueKey
////                                            + " ?" + currentClass + "_" + valueKey + ".";
//                                } else {
//                                    setWhere.add("\n       ?" + arrayObjectDomain.get(0) + " "
//                                            + prefix + ":" + valueKey
//                                            + " ?" + currentClass + "_" + valueKey + ".");
//
////                                    query += "\n       ?" + arrayObjectDomain.get(0) + " "
////                                            + prefix + ":" + valueKey
////                                            + " ?" + currentClass + "_" + valueKey + ".";
//                                }
//                            }
//                        }
//                    }
//                }
//            }
//        }
//
//        for (String varWhere : setWhere) {
//            queryUnion += varWhere;
//        }
//
//        //System.out.println(queryUnion);
//        //query += "\n}";
//        //System.out.println(queryUnion);
//        arrayObjectDomain.remove(arrayObjectDomain.get(0));
//    }
//
//    @Override
//    public void buildsHeadQuery() {
//        throw new UnsupportedOperationException("Not supported yet.");
//    }
//
//    public void executeQuery() throws OWLOntologyCreationException {
//        //buildsHeadQuery();
//        ArrayList<String> arrayUnion = new ArrayList<String>();
//        arrayUnion.add("Drug");
//        arrayUnion.add("GenericDrug");
//        //arrayUnion.add("SideEffect");
//        //arrayUnion.add("Autor");
//        //arrayUnion.add("Livro");
//
//        if (arrayUnion.size() > 1) {
//            for (String name : arrayUnion) {
//                buildsSelectRasc(name, "", arrayUnion);
//                buildsWhereRasc(arrayUnion);
//                System.out.println(query + "\n");
//            }
//        } else {
//            //buildsSelect("Autor", "nomeAutor", arrayUnion);
//            buildsSelectRasc("Disease", "", arrayUnion);
//            ArrayList<String> buildsWhere = buildsWhereRasc(arrayUnion);
//
//            System.out.println(query + "\n");
//            for (String name : buildsWhere) {
//                //System.out.println(teste);
//                if (!buildsWhere.isEmpty()) {
//                    buildsSelectRasc(name, "", arrayUnion);
//                    buildsWhere = buildsWhereRasc(arrayUnion);
//                }
//                System.out.println(query + "\n");
//            }
//        }
//    }
//
//    @Override
//    public String buildsSelect(Map<String, Set<String>> mapDatatype, String activeUnion) throws OWLOntologyCreationException {
//        throw new UnsupportedOperationException("Not supported yet.");
//    }
//
//    @Override
//    public String buildsWhere(Map<String, Set<String>> mapDatatype, Set<String> setOptional, Set<String> setFilter) throws OWLOntologyCreationException {
//        throw new UnsupportedOperationException("Not supported yet.");
//    }
//
//    @Override
//    public String buildsSelectUnion(Map<String, Set<String>> mapDatatype) {
//        throw new UnsupportedOperationException("Not supported yet.");
//    }
//
//    @Override
//    public Set<String> buildsWhereUnion(Map<String, Set<String>> mapDatatype) {
//        throw new UnsupportedOperationException("Not supported yet.");
//    }
//}
